//箭头函数

"use strict"
var arr = [20, 5, 56, 8, 2, 1];
arr.sort((x, y) => {
    return x - y;
});

console.log(arr);

//this直接调用obj对象
var obj = {
    birth: 1998,
    getAge: function() {
        var b = this.brith;
        var fn = () => new Date().getFullYear() - this.birth;

        return fn();
    }

}
console.log(obj.getAge());
//this指向birth
"use strict"
var obj = {
    birth: 1998,
    getAge: function(year) {
        var b = this.brith;
        var fn = (y) => y - this.birth;

        return fn.call({ birth: 1998 }, year);
    }

}
console.log(obj.getAge(2021));

// typeof 123; // 'number'
// typeof NaN; // 'number'
// typeof 'str'; // 'string'
// typeof true; // 'boolean'
// typeof undefined; // 'undefined'
// typeof Math.abs; // 'function'
// typeof null; // 'object'
// typeof []; // 'object'
// typeof {}; // 'object'
// //可见，number、string、boolean、function和undefined有别于其他类型。
// //特别注意null的类型是object，Array的类型也是object，如果我们用typeof将无法区分出null、
// //Array和通常意义上的object——{}。

// `
// var n = new Number(123); // 123,生成了新的包装类型
// var b = new Boolean(true); // true,生成了新的包装类型
// var s = new String('str'); // 'str',生成了新的包装类型
// `
// ``
// //虽然包装对象看上去和原来的值一模一样，显示出来也是一模一样，
// //但他们的类型已经变为object了！所以，包装对象和原始值用===比较会返回false：

// typeof new Number(123); // 'object'
// new Number(123) === 123; // false

// typeof new Boolean(true); // 'object'
// new Boolean(true) === true; // false

// typeof new String('str'); // 'object'
// new String('str') === 'str'; // false



// // 如果我们在使用Number、Boolean和String时，没有写new会发生什么情况？

// // 此时，Number()、Boolean和String()被当做普通函数，把任何类型的数据转换为number、boolean和string类型（注意不是其包装类型）：

// var n = Number('123'); // 123，相当于parseInt()或parseFloat()
// typeof n; // 'number'

// var b = Boolean('true'); // true
// typeof b; // 'boolean'

// var b2 = Boolean('false'); // true! 'false'字符串转换结果为true！因为它是非空字符串！
// var b3 = Boolean(''); // false

// var s = String(123.45); // '123.45'
// typeof s; // 'string'



// // 总结一下，有这么几条规则需要遵守：

// // + 不要使用new Number()、new Boolean()、new String()创建包装对象；

// // + 用parseInt()或parseFloat()来转换任意类型到number；

// // + 用String()来转换任意类型到string，或者直接调用某个对象的toString()方法；

// // + 通常不必把任意类型转换为boolean再判断，因为可以直接写if (myVar) {...}；

// // + typeof操作符可以判断出number、boolean、string、function和undefined；

// // + 判断Array要使用Array.isArray(arr)；

// // + 判断null请使用myVar === null；

// // + 判断某个全局变量是否存在用typeof window.myVar === 'undefined'；

// // + 函数内部判断某个变量是否存在用typeof myVar === 'undefined'。

// // 最后有细心的同学指出，任何对象都有toString()方法吗？null和undefined就没有！确实如此，这两个特殊值要除外，虽然null还伪装成了object类型。

// // 更细心的同学指出，number对象调用toString()报SyntaxError：

// 123. toString(); // SyntaxError

// //遇到这种情况，要特殊处理一下：

// 123..toString(); // '123', 注意是两个点！
// (123).toString(); // '123'

var now = new Date();
now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
now.getFullYear(); // 2015, 年份
now.getMonth(); // 5, 月份，注意月份范围是0~11，5表示六月
now.getDate(); // 24, 表示24号
now.getDay(); // 3, 表示星期三
now.getHours(); // 19, 24小时制
now.getMinutes(); // 49, 分钟
now.getSeconds(); // 22, 秒
now.getMilliseconds(); // 875, 毫秒数
now.getTime(); // 1435146562875, 以number形式表示的时间戳

var d = new Date(1235846835213584);
console.log(d);
console.log(d.getFullYear());
console.log(d.toLocaleString());
if (Date.now) {
    console.log(Date.now());
} else {
    console.log(Date.now().getTime());
}

//使用Date.parse()时传入的字符串使用实际月份01~12，转换为Date对象后getMonth()获取的月份值为0~11。
let today = new Date();
if (today.getMonth() === 1 && today.getDate() === 12) {
    console.log("亲爱的，晚上六点我们一起去吃晚餐！");
}



'use strict'
//RegExp

/*
用\d可以匹配一个数字，\w可以匹配一个字母或数字
'00\d'可以匹配'007'，但无法匹配'00A'；

'\d\d\d'可以匹配'010'；

'\w\w'可以匹配'js'；

.可以匹配任意字符，所以：

'js.'可以匹配'jsp'、'jss'、'js!'等等

要匹配变长的字符，在正则表达式中，用*表示任意个字符（包括0个）
用+表示至少一个字符，用?表示0个或1个字符，用{n}表示n个字符，用{n,m}表示n-m个字符：
\d{3}表示匹配3个数字，例如'010'；

\s可以匹配一个空格（也包括Tab等空白符），所以\s+表示至少有一个空格，例如匹配' '，'\t\t'等；

\d{3,8}表示3-8个数字，例如'1234567'。
[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线；

[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串，比如'a100'，'0_Z'，'js2015'等等；

[a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或下划线、$开头，后接任意个由一个数字、字母或者下划线、$组成的字符串，也就是JavaScript允许的变量名；

[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}更精确地限制了变量的长度是1-20个字符（前面1个字符+后面最多19个字符）。

A|B可以匹配A或B，所以(J|j)ava(S|s)cript可以匹配'JavaScript'、'Javascript'、'javaScript'或者'javascript'。

^表示行的开头，^\d表示必须以数字开头。

表示行的结束，\d表示必须以数字结束。

你可能注意到了，js也可以匹配'jsp'，但是加上^js$就变成了整行匹配，就只能匹配'js'了。
*/

//创建正则表达式

/*
JavaScript有两种方式创建一个正则表达式：

第一种方式是直接通过/正则表达式/写出来，第二种方式是通过new RegExp('正则表达式')创建一个RegExp对象。
*/
let r1 = /ABC\-001/;
let r2 = new RegExp('/ABC\\-001/'); //因为字符串转义的问题两个\\其实是一个\

console.log(r1);
console.log(r2);

//切分字符串

let str = 'a b    c'

console.log(str.split());

console.log(str.split(/\s+/)); //\s表示空格+表示至少有一个空格

console.log(str.split(/[\s\,]+/)); //表示不管有多少个空格都可以正常分割